package com.cskaoyan.javase.oop1._5this;

/**
 * 学习完对象与类后，做以下练习：
 * 创建一个汽车类，有颜色（color）和速度（speed）两个属性，行为是可以跑（run）。
 * 实现：
 * 在run成员方法中访问速度和颜色两个属性，调用该方法查看结果。
 * 在run成员方法的形参列表中，添加一个局部变量speed，不修改方法体，调用该方法查看结果。
 * 思考：
 * 两次方法调用的结果一样吗？为什么？
 * 如果我想在2中得到1的访问结果，怎么办呢？
 *
 * 当成员方法的形参列表中,存在和当前类同名的成员变量的局部变量时,
 * 如果这时仍然在方法体中访问同名该变量
 * 那么根据"就近原则",会优先匹配局部变量.
 *
 * 思考:
 *  这种情况下,我仍然想访问同名的成员变量咋办?
 *  以前的语法是做不到的,这里需要使用this关键字
 *
 *
 *  this关键字:
 *  在Java的类中,每一个成员方法的形参列表中,都隐含了一个传参,这个传参指向当前对象,用this接收,所以this是一个引用,是成员方法中隐含传参,指向当前对象
 *
 *  何为当前对象?
 *  成员方法最终肯定需要对象名来调用(说白了,需要对象调用)
 *  哪个对象来调用这个成员方法,那个对象就是当前对象
 *
 *  this关键字的作用:
 *      1.在成员方法中,用来区分同名的成员变量和方法形参的局部变量
 *      2.成员方法中隐含this传参,所以可以在成员方法中,随意访问当前对象的成员变量和成员方法.(注: 如果不存在同名变量,或者访问成员方法,this.可以省略,没必要写出来)
 *      3.在成员方法中只要使用 "this."访问 一个变量，那么该变量一定是成员变量。在代码比较复杂的情况下，可以显著增加代码可读性。(但这不是必须的)
 *      4.this关键字的用途还有其它场景会使用,未完待续!
 *
 * 总结和注意事项
 * 1.this指向当前对象的隐含传参，必须是在普通成员方法中，加static的方法中，没有该this传参。（所以static方法不能直接访问类的成员，需要先创建对象才能访问。）
 *
 * 2.既然this指向当前对象，那么不同的this指向的对象必然不同。
 *
 *
 *
 * @since 14:43
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        Car c = new Car();
        // 下面这个方法调用,当前对象,this指向的就是c对象
        c.run(200);
        System.out.println(c);

        System.out.println("-----------");
        Car c2 = new Car();
        c2.run(300);
        System.out.println(c2);
    }
}

class Car {
    String color = "黑色";
    double speed = 120;

    public void run(double speed) {
        // 隐含的传参,指向当前对象
        System.out.println(this);
        System.out.println("颜色是" + color + "的小汽车,以" + this.speed + "的速度在奔驰!");
        // this.test();
        test();
    }

    public void test() {
    }

    public static void testStatic(){
        // 非成员方法中,static方法不存在this传参
        // System.out.println(this);
    }
}
